#include <string>
#include <iostream>
#include <cstdlib>
#include "Sock.hpp"
#include "Reactor.hpp"
#include "Accepter.hpp"
#include "Util.hpp"
void Usage(const std::string &proc)
{
    std::cerr << "Usage:" << proc << " port" << std::endl;
    exit(1);
}
int main(int argc, char **argv)
{
    if (argc != 2)
    {
        Usage(argv[0]);
    }

    uint16_t port = atoi(argv[1]);

    int listen_sock = Sock::Socket();

    //设置为非阻塞监听套接字
    SetNoBlock(listen_sock);

    Sock::Bind(listen_sock, port);
    Sock::Listen(listen_sock);

    //创建Reactor反应堆对象
    /************************************
     * 反应堆模式：通过多路转接的方案，被动的采用事件派发方式，去反向的调用对应响应事件的回调函数
     * ***********************************/
    Reactor *R = new Reactor();
    R->InitReactor(); //内部就是创建epoll模型
    //向反应堆中加入柴火

    //准备柴火
    Event *evp = new Event;
    evp->sock = listen_sock;
    evp->R = R; //每一根柴火都要知道自己被添加到哪个反应堆上嘞
    // Accpeter:是链接管理器
    evp->RegisterCallBack(Accepter, nullptr, nullptr); //注册读事件的回调，写和异常不关心

    //柴火放入反应堆
    R->InsertEvent(evp, EPOLLIN | EPOLLET); //设置了ET模式，那么就要对底层到来的新连接进行循环读取

    //事件派发
    int timeout = 1000;
    for (;;)
    {
        R->Dispastcher(timeout);
    }

    return 0;
}